iT邦幫忙

2023 iThome 鐵人賽

DAY 2
0
DevOps

SRE/K8S 碎碎念系列 第 2

[D2] 如何 access 到 private EKS

  • 分享至 

  • xImage
  •  

在架構圖中,我們可以看到因為 EKS 在 private 環境中,我們必須使用相同 VPC 內的 bastion 來操作他。

這邊要先科普一下 EKS 的權限管理,當我們使用任意權限建立 EKS 的時候,他會自動建立一個預設的 cluster role 跟 service account。注意!這個預設的 cluster role 會跟你建立時所使用的 iam role / iam user 綁在一起。

正常情況下公司可能會是 CI/CD runner 所賦予的角色。

但這次為了 Demo,並沒有建置完整的 CI / CD 環境,所以如果我在 local 直接執行 terraform 建立,他會用我當前的角色 sso role 作為預設最高角色。而正常來說,我們並不會在 bastion 上使用 sso role,所以我們希望有一個固定的 role 作為預設最高權限來進行操作,並將他用成 instance profile 給 bastion。

今天就來分享如何賦予權限

建置前有四個名詞要搞懂

  1. Cluster role / role

    ClusterRole 是 Kubernetes 中定義角色的一種方法,用於控制對集群中資源的存取權限,可以跨多個命名空間共享,並可以將其綁定到特定的服務帳戶,以便實現精準的權限控制

    Role,僅在單個命名空間內生效

  2. Service Account:Kubernetes 中的Service Account 用於將特定的權限授予應用程式和工作負載。這是一個讓應用程式與 K8s API 進行交互並根據需要進行認證的方式。通常情況下,每個應用程式或命名空間都有自己的服務帳戶,以確保它們只能訪問所需的資源。

  3. OIDC Providers:AWS 提供了 OIDC(OpenID Connect)身份驗證,以便您可以將 AWS IAM 角色與 Kubernetes 的服務帳戶關聯起來。通過將 IAM 角色與 Kubernetes 服務帳戶關聯,您可以確保應用程式在 AWS 中具有適當的存取權限。例如,您可能希望給一個應用提供 Amazon S3 存儲桶的存取權限,而另一個應用則無法訪問 Amazon S3。

  4. aws-auth ConfigMap 是 AWS EKS 中用於將 IAM 使用者和角色與 Kubernetes RBAC 角色相關聯的配置文件。

aws-auth ConfigMap 和 OIDC Providers 在 AWS EKS 中都涉及到身份和訪問管理,但它們分別處理不同方面的認證和授權。以下是它們之間的關係:

  1. aws-auth ConfigMap:它將 AWS 的 IAM 使用者和角色映射到 Kubernetes 中的 RBAC 角色。這主要用於集群內部的訪問管理,例如控制哪些 IAM 使用者或角色有權限訪問您的 EKS 集群。通常在新建立 EKS 集群後, 會首先更新此 aws-auth ConfigMap, 以添加新的 IAM 使用者或角色,以便它們能夠訪問 EKS 集群。
  2. OIDC Providers (OpenID Connect):它使用任何 OpenID Connect 兼容的 Identity Provider(IdP)來管理 Kubernetes 中的使用者身份,而無需在 Kubernetes 中手動管理使用者和密碼。在 AWS EKS 環境中,Amazon 提供了一個內置的 OIDC Identity Provider,您可以將其與 AWS IAM 进行整合,從而更好地管理您的 EKS 集群。這主要涉及到 Kubernetes 資源的訪問管理,例如 Pods、Services 和其他資源。

即使它們都涉及到 EKS 集群中的身份和訪問管理,但它們實際上解決的是不同層面的問題:

  • aws-auth ConfigMap 主要用於控制對 EKS 集群本身的訪問,也就是說,哪些 AWS IAM 使用者和角色可以訪問 EKS 集群。
  • OIDC Providers 則通過與 Identity Provider(如 AWS IAM 或其他 IdP)集成,提供統一的身份驗證和授權機制,以控制對 Kubernetes 資源的訪問,例如在 Kubernetes 集群內部運行的應用程式。

在 Terraform 上實踐

module "irsa_role" {
  source  = "terraform-aws-modules/iam/aws//modules/iam-role-for-service-accounts-eks"
  version = "5.30.0"

  role_name              = "eks-bastion-role-irsa"
  allow_self_assume_role = true

  

  oidc_providers = {
    one = {
      provider_arn               = module.eks.oidc_provider_arn
      namespace_service_accounts = ["default:default"]
    }
  }

  role_policy_arns = {
    AmazonEKS_CNI_Policy = "arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy"
    additional           = aws_iam_policy.custom_eks_policy.arn
  }
}

resource "aws_iam_policy" "custom_eks_policy" {
  name        = "CustomEKSPolicy"
  description = "A custom policy for describing EKS clusters"
  policy      = <<EOF
		{
		  "Version": "2012-10-17",
		  "Statement": [
		    {
		      "Effect": "Allow",
		      "Action": [
		        "eks:*"
		      ],
		      "Resource": "*"
		    },
		    {
		      "Effect": "Allow",
		      "Action": [
		        "configmaps:*"
		      ],
		      "Resource": "*"
		    }
		  ]
		}
	EOF
}

上一篇
Day 1 開賽及架構介紹
下一篇
Day 3 使用 Session Manager 連線至 EKS
系列文
SRE/K8S 碎碎念30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言